package com.chentf.controller;

import com.chentf.entity.Product;
import com.chentf.vo.CollectionVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;

/**
 * @author chentengfei
 * @desc ...
 * @date 2021-09-19 19:58:16
 */
@RestController
public class PorductController {
    private static final Logger log = LoggerFactory.getLogger(PorductController.class);

    @Value("${server.port}")
    private int port;

    @GetMapping("productList")
    public Map<String,Object> findByCategoryIdAndPage(Integer page,Integer rows,Integer categoryId){
        log.info("当前页:{},每页显示记录数:{},当前类别id:{}",page,rows,categoryId);
        //根据类别id分页查询符合当前页集合数据  List<Product>   select * from t_product where categoryId=? limt ?(page-1)*rows,?(rows)
        //根据类别id查询当前类别下总条数       totalCount           select count(id) from t_product where categoryId=?
        Map<String,Object> map = new HashMap<>();
        List<Product> products = new ArrayList<>();
        products.add(new Product(1,"java并发编程",BigDecimal.valueOf(48),LocalDateTime.now()));
        products.add(new Product(2,"java虚拟机",BigDecimal.valueOf(58),LocalDateTime.now()));
        products.add(new Product(3,"springboot原理",BigDecimal.valueOf(88),LocalDateTime.now()));
        int total = 100;
        map.put("rows",products);
        map.put("total",total);
        return map;
    }

    //定义一个接口接收id类型参数,返回一个基于id查询的List集合
    @GetMapping("/products")
    public List<Product> findByCategoryId(Integer categoryId){
        log.info("类别id:{}",categoryId);
        //调用业务逻辑根据类别id查询商品列表,此处一般查询数据库
        List<Product> products = new ArrayList<>();
        products.add(new Product(1,"java并发编程",BigDecimal.valueOf(48),LocalDateTime.now()));
        products.add(new Product(2,"java虚拟机",BigDecimal.valueOf(58),LocalDateTime.now()));
        products.add(new Product(3,"springboot原理",BigDecimal.valueOf(88),LocalDateTime.now()));
        return products;
    }

    //定义一个接口接收id类型参数,返回一个基于id查询的对象
    @GetMapping("/product/{id}")
    public Product product(@PathVariable("id") Integer id){
        log.info("id:{}",id);
        return new Product(id,"java架构师", BigDecimal.valueOf(56.56), LocalDateTime.now());
    }


    //定义一个接口接受集合类型参数
    //springmvc 不能直接接受集合类型参数,如果想要接收集合类型参数必须将集合放入对象中,使用对象的方式接收才行
    //oo: oriented(面向) object(对象) 面向对象
    // vo(value object): 用来传递数据对象称之为值对象
    // dto:(data transfer(传输) object):数据传输对象
    @GetMapping("/test04")
    public String test04(CollectionVO collectionVO){
        collectionVO.getIds().forEach(id -> log.info("id:{}",id));
        return "test04 ok,当前服务端口为:"+port;
    }

    //定义接口接收数组类型参数
    @GetMapping("/test03")
    public String test03(String[] ids){
        for (String id : ids) {
            log.info("id:{}",id);
        }
        //手动转换成list
        //List<String> strings = Arrays.asList(ids);
        return "test03 ok,当前服务端口为:"+port;
    }

    //定义一个接受对象类型参数接口
    @PostMapping("/test02")
    public String test02(@RequestBody Product product){
        log.info("product:{}",product);
        return "test2 ok,当前服务端口为: "+port;
    }

    //声明调用商品服务中test01接口,路径传递参数
    @GetMapping("/test01/{id}/{name}")
    public String test01(@PathVariable("id") String id,@PathVariable("name") String name){
        log.info("id:{},name:{}",id,name);
        return "test01 ok,当前服务的端口为:"+port;
    }

    //定义一个接受零散类型参数接口
    @GetMapping("/test")
    public String test(String name,Integer age){
        log.info("name:{},age:{}",name,age);
        return "test ok,当前服务的端口为:"+port;
    }

    @GetMapping("/product")
    public String product() throws InterruptedException {
        log.info("进入商品服务.....");
        //Thread.sleep(2000);
        return  "product ok,当前提供服务端口:"+port;
    }
}
